/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo;

import clases.Articulo;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
/**
 *
 * @author Edder
 */
public class MdlArticulo implements Modelo<Articulo> {
    
    /**
     *
     * @param articulo
     * @param cnx
     * @throws SQLException
     */
    @Override
    public void insert(Articulo articulo, Conexion cnx) throws SQLException{
        String sql = "INSERT INTO articulo(nombre, presentacion, descripcion, "
                + "stockMinimo, tamaño, unidad, codigoBarras, idCategoria, "
                + "precioVenta, urlImagen, estado) "
                + "VALUES( '" + articulo.getNombre() + "', "
                + "'" + articulo.getPresentacion() + "', "
                + "'" + articulo.getDescripcion() + "', "
                + articulo.getStockMinimo() + ", "
                + "'" + articulo.getTamaño() + "', "
                + "'" + articulo.getUnidad() + "', "
                + "'" + articulo.getCodigoBarras() + "', "
                + articulo.getCategoria().getIdCategoria() + ", "
                + articulo.getPrecioVenta() + ", "
                + "'" + articulo.getUrlImagen() + "', "
                + "'" + articulo.getEstado() + "')";
        cnx.ejecutar(sql);
    }
    
    /**
     *
     * @param cnx
     * @return
     * @throws SQLException
     */
    @Override
    public int getLastId(Conexion cnx) throws SQLException{
        String sql = "SELECT idArticulo FROM articulo ORDER BY idArticulo DESC LIMIT 1";
        ResultSet rs = cnx.consultar(sql);
        if(rs.next()){
            return rs.getInt(1);
        }
        return -1;
    }    
    
    /**
     * 
     * @param articulo
     * @param cnx
     * @throws SQLException 
     */
    @Override
    public void update(Articulo articulo, Conexion cnx) throws SQLException{
        String sql = "UPDATE articulo SET "
                + "nombre = '" + articulo.getNombre() + "', "
                + "presentacion = '" + articulo.getPresentacion() + "', "
                + "descripcion = '" + articulo.getDescripcion() + "', "
                + "stockMinimo = " + articulo.getStockMinimo() + ", "
                + "tamaño = " + articulo.getTamaño() + ", "
                + "unidad = '" + articulo.getUnidad() + "', "
                + "codigoBarras = '" + articulo.getCodigoBarras() + "', "
                + "idCategoria = " + articulo.getCategoria().getIdCategoria() + ", "
                + "precioVenta = " + articulo.getPrecioVenta() + ", "
                + "urlImagen = '" + articulo.getUrlImagen() + "', "
                + "estado = '" + articulo.getEstado() + "' "
                + "WHERE idArticulo = " + articulo.getIdArticulo();
        cnx.ejecutar(sql);
    }
    
    /**
     * Cambia estado del artículo a 'I' : Inactivo
     * @param articulo
     * @param cnx
     * @throws SQLException
     */
    public void dar_baja(Articulo articulo, Conexion cnx) throws SQLException{
        String sql = "UPDATE articulo SET "
                + "estado = 'I' "
                + "WHERE idArticulo = " + articulo.getIdArticulo();
        cnx.ejecutar(sql);
    }
    /**
     * 
     * @param stock
     * @param idArticulo
     * @param idAlmacen
     * @param cnx
     * @throws SQLException 
     */
    public void updateStock(int stock, int idArticulo, int idAlmacen, Conexion cnx) throws SQLException{
        String sql = "UPDATE almacenarticulo SET "
                + "stock += " + stock + " "
                + "WHERE idAlmacen = " + idAlmacen + " "
                + "AND idArticulo = " + idArticulo;
        cnx.ejecutar(sql);
    }
    
    /**
     * 
     * @param idArticulo
     * @param idAlmacen
     * @param cnx
     * @throws SQLException 
     */
    public void asignarAlmacen(int idArticulo, int idAlmacen, Conexion cnx) throws SQLException{
        String sql = "INSERT INTO almacenarticulo(idAlmacen, idArticulo, stock, stockMinimo) "
                + "VALUES(" + idAlmacen + ", " + idArticulo + ", 0, 0)";
        cnx.ejecutar(sql);
    }
    
    /**
     * 
     * @param query
     * @param where
     * @param cnx
     * @return
     * @throws SQLException 
     */
    public ArrayList<Articulo> getArticulos(String query, String where, Conexion cnx) throws SQLException, SQLException, SQLException, SQLException{
        String sql;
        sql = "SELECT * FROM articulo "
                + "WHERE (nombre LIKE '%" + query + "%' "
                + "OR descripcion LIKE '%" + query + "%') "
                + ((where != null && !where.equals(""))? where : ";");
        return get(sql, cnx);
    }
    
    /**
     * 
     * @param query
     * @param cnx
     * @return
     * @throws SQLException 
     */
    
    public ArrayList<Articulo> getArticulos(String query, Conexion cnx) throws SQLException{
        String sql = "SELECT idArticulo, nombre FROM articulo;";
        return get(sql, cnx);
    }
    
    /**
     * 
     * @param idCategoria
     * @param cnx
     * @return
     * @throws SQLException 
     */
    public ArrayList<Articulo> getArticulos_categoria(int idCategoria, Conexion cnx) throws SQLException{
        String sql = "SELECT * FROM articulo "
                + "WHERE idCategoria = " + idCategoria + "; ";
        return get(sql, cnx);
    }
    
    public ArrayList<Articulo> getArticulos_almacen(int idAlmacen, String busqueda, Conexion cnx) throws SQLException{
        String sql = "SELECT a.idArticulo, a.nombre, a.presentacion, a.descripcion, a.stockMinimo, "
                + "a.tamaño, a.unidad, a.codigoBarras, a.idCategoria, a.precioVenta, a.urlImagen, a.estado "
                + "FROM articulo as a "
                + "INNER JOIN almacenarticulo as aa "
                + "ON a.idArticulo = aa.idArticulo "
                + "WHERE aa.idAlmacen = " + idAlmacen + " and "
                + "a.nombre LIKE '%" + busqueda + "%';";
        return get(sql, cnx);
    }
    
    /**
     * 
     * @param idCategoria
     * @param query
     * @param cnx
     * @return
     * @throws SQLException 
     */
    public ArrayList<Articulo> getArticulos_categoria(int idCategoria, String query, Conexion cnx) throws SQLException{
        String sql = "SELECT * FROM articulo "
                + "WHERE nombre LIKE '%" + query + "%' "
                + "OR descripcion LIKE '%" + query + "%' "
                + "AND idCategoria = " + idCategoria + "; ";
        return get(sql, cnx);        
    }
    
//    public ArrayList<Articulo> getArticulos_almacen(int idAlmacen, String query, Conexion cnx) throws SQLException{
//        String sql = "SELECT a.idArticulo, a.nombre, a.presentacion, a.descripcion, a.stockMinimo, "
//                + "a.tamaño, a.unidad, a.codigoBarras, a.idCategoria, a.precioVenta, a.urlImagen, a.estado "
//                + "FROM articulo as a "
//                + "INNER JOIN almacenarticulo as aa "
//                + "ON a.idArticulo = aa.idArticulo "
//                + "WHERE aa.idAlmacen = " + idAlmacen + " AND "
//                + "(nombre LIKE '%" + query + "%' "
//                + "OR descripcion LIKE '%" + query + "%' )";
//        return get(sql, cnx);
//    }
    
    /**
     * 
     * @param idArticulo
     * @param cnx
     * @return
     * @throws SQLException 
     */
    @Override
    public Articulo get(int idArticulo, Conexion cnx) throws SQLException{
        String sql = "SELECT * FROM articulo "
                + "WHERE idArticulo = " + idArticulo + "; ";
        ResultSet rs = cnx.consultar(sql);
        Articulo articulo = null;
        if(rs.next()){
            articulo = new Articulo(rs.getInt(1), 
                    rs.getString(2), 
                    rs.getString(3), 
                    rs.getString(4), 
                    rs.getInt(5), 
                    rs.getString(6), 
                    rs.getString(7),
                    rs.getString(8),
                    new clases.Categoria(rs.getInt(9), null), 
                    rs.getFloat(10), 
                    rs.getString(11),
                    rs.getString(12).charAt(0));
        }
        return articulo;
    }
    
    /**
     *Devuelve un arreglo de Object de  3 columnas (idArticulo, nombre, stock)
     * @param idAlmacen
     * @param query
     * @param cnx
     * @return ArrayList<Object[]>
     * @throws SQLException
     */
    public ArrayList<Object[]> getArticulosStock_almacen(int idAlmacen, String query, Conexion cnx) throws SQLException{
        String sql = "select a.idArticulo, a.nombre, aa.stock "
                + "from articulo as a "
                + "inner join almacenarticulo as aa "
                + "on a.idArticulo = aa.idArticulo "
                + "where (a.nombre LIKE '%" + query + "%' "
                + "OR a.descripcion LIKE '%" + query + "%') "
                + "AND aa.idAlmacen = " + idAlmacen;
        ResultSet rs = cnx.consultar(sql);
        ArrayList<Object[]> articulosStock = new ArrayList<>();
        while(rs.next()){
            Object[] stock = new Object[]{
                rs.getInt("idArticulo"),
                rs.getString("nombre"),
                rs.getInt("stock")
            };
            articulosStock.add(stock);
        }
        
        return articulosStock;
    }
    
    
    @Override
    public ArrayList<Articulo> get(String sql, Conexion cnx) throws SQLException{
        ArrayList<Articulo> articulos = new ArrayList<>();
        ResultSet rs = cnx.consultar(sql);
        while(rs.next()){
            articulos.add(new Articulo(rs.getInt(1), 
                    rs.getString(2), 
                    rs.getString(3), 
                    rs.getString(4), 
                    rs.getInt(5), 
                    rs.getString(6), 
                    rs.getString(7),
                    rs.getString(8),
                    new clases.Categoria(rs.getInt(9), null), 
                    rs.getFloat(10), 
                    rs.getString(11),
                    rs.getString(12).charAt(0)));
        }
        return articulos;
    }
}
